package com.bridgeintelligent.tag.webserver.dim.mgmt.service.export;

import com.bridgeintelligent.tag.constants.ExceptionCodes;
import com.bridgeintelligent.tag.mapper.CatalogMapper;
import com.bridgeintelligent.tag.mapper.DimItemMapper;
import com.bridgeintelligent.tag.mapper.DimMapper;
import com.bridgeintelligent.tag.utils.DateHelper;
import com.bridgeintelligent.tag.webserver.dim.mgmt.api.*;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;


@Service
@AllArgsConstructor
@Slf4j
public class ExportSerivice implements IExportService {

    private DimMapper dimMapper;
    private DimItemMapper dimItemMapper;
    private CatalogMapper catalogMapper;

    /**
     * 文件批量新增基础标签
     *
     * @param excelFile
     */
    @Override
    public DimRep upload(MultipartFile excelFile) {
        try {
            //读取Excel文件
            List<String[]> list = POIUtils.readExcel(excelFile);
            if (list != null && list.size() > 0) {
                //符合要求的数据
                List<String[]> queryList = new ArrayList<>();
                for (int i = 1; i < list.size(); i++) {
                    if (checkList(list.get(i))) {
                        queryList.add(list.get(i));
                    }
                }
                //基础标签
                DimData dimData = new DimData();
                //数据处理
                if (queryList != null && queryList.size() > 0) {
                    for (String[] strings : queryList) {
                        //基础标签
                        dimData.setDimId(IdWorker.nextId());
                        dimData.setDimLargeType("01");  //基础标签类型
                        dimData.setDataSource(strings[1]);  //数据来源
                        if ("是".equals(strings[2])) {//是否投产
                            dimData.setWorking(true);
                        } else if ("否".equals(strings[2])) {
                            dimData.setWorking(false);
                        }
                        dimData.setTheme(strings[3]);  //所属主题
                        dimData.setTagGroup(strings[7]);//标签组
                        dimData.setDimId(strings[8].toLowerCase());  //标签id
                        dimData.setDimName(strings[9]);  //标签名称

                        if ("描述标签".equals(strings[10])) {//标签类型
                            dimData.setClassify("01");
                        } else if ("标志标签".equals(strings[10])) {
                            dimData.setClassify("02");
                        } else if ("数值标签".equals(strings[10])) {
                            dimData.setClassify("03");
                        } else if ("标识标签".equals(strings[10])) {
                            dimData.setClassify("04");
                        }else if ("日期标签".equals(strings[10])) {
                            dimData.setClassify("05");
                        }
                        dimData.setShowType(strings[11]);//展示规则
                        dimData.setIsTagFlag(strings[12]);//是否现成标签
                        dimData.setDefaultValue(strings[13]);//标签缺省值
                        dimData.setOrgNo(strings[14]);//机构号
                        dimData.setTagSourceType(strings[15]);//标签来源类型

                        //是否同业重点关注
//                        if ("是".equals(strings[16])) {
//                            dimData.setIssamebu(true);
//                        } else if ("否".equals(strings[16])) {
//                            dimData.setIssamebu(false);
//                        }
//                        //是否公司重点关注
//                        if ("是".equals(strings[17])) {
//                            dimData.setIscompany(true);
//                        } else if ("否".equals(strings[17])) {
//                            dimData.setIscompany(false);
//                        }
//                        //是否风险部重点关注
//                        if ("是".equals(strings[18])) {
//                            dimData.setIsrisk(true);
//                        } else if ("否".equals(strings[18])) {
//                            dimData.setIsrisk(false);
//                        }
//                        //是否适用潜客
//                        if ("是".equals(strings[19])) {
//                            dimData.setIspocust(true);
//                        } else if ("否".equals(strings[19])) {
//                            dimData.setIspocust(false);
//                        }
//                        //是否适用集团
//                        if ("是".equals(strings[20])) {
//                            dimData.setIsgroup(true);
//                        } else if ("否".equals(strings[20])) {
//                            dimData.setIsgroup(false);
//                        }
//                        //是否适用银行
//                        if ("是".equals(strings[21])) {
//                            dimData.setIsbank(true);
//                        } else if ("否".equals(strings[21])) {
//                            dimData.setIsbank(false);
//                        }
//                        //是否适用保险
//                        if ("是".equals(strings[22])) {
//                            dimData.setIsinsure(true);
//                        } else if ("否".equals(strings[22])) {
//                            dimData.setIsinsure(false);
//                        }
//                        //是否适用证券
//                        if ("是".equals(strings[23])) {
//                            dimData.setIsbond(true);
//                        } else if ("否".equals(strings[23])) {
//                            dimData.setIsbond(false);
//                        }
//                        //是否适用养老
//                        if ("是".equals(strings[24])) {
//                            dimData.setIsendow(true);
//                        } else if ("否".equals(strings[24])) {
//                            dimData.setIsendow(false);
//                        }
//                        //是否适用租赁
//                        if ("是".equals(strings[25])) {
//                            dimData.setIsrent(true);
//                        } else if ("否".equals(strings[25])) {
//                            dimData.setIsrent(false);
//                        }
                        dimData.setDefinition(strings[26]);  //标签含义解释
                        dimData.setScenarios(strings[27]);  //应用场景
                        dimData.setOutputMethod(strings[28]); //产出办法
                        //建议更新频率
                        if ("每日".equals(strings[29])) {
                            dimData.setUpdataCycle("d");
                        } else if ("每周".equals(strings[29])) {
                            dimData.setUpdataCycle("w");
                        } else if ("每月".equals(strings[29])) {
                            dimData.setUpdataCycle("m");
                        }
                        dimData.setBusinessDepartment(strings[30]);//标签归属方
                        dimData.setBusinessLeader(strings[31]);  //业务负责人

                        dimData.setSystemCode(strings[32]);//系统代码
                        dimData.setSourcesDb(strings[33]);//数据库英文名
                        dimData.setSourcesTable(strings[34]);//数据表英文名
                        dimData.setSourcesColumn(strings[35]);//标签字段英文名

                        dimData.setSavePath(strings[36]);//存储位置
                        dimData.setSkillDepartment(strings[37]);//技术负责部门
                        dimData.setTagCustType(strings[38]);//数据表客户类型
                        dimData.setTimeCycle(strings[39]);//时间周期

                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        dimData.setCreateTime(sdf.format(new Date()));  //创建时间
                        dimData.setUptTime(sdf.format(new Date()));  //更新时间
                        dimData.setState("01");
                        dimData.setApproveState("4");

                        //设置标签目录
                        setCatalog(dimData, strings);

                        // 收藏标识、推荐标识false
                        dimData.setIscollect(false);
                        dimData.setIsrecommended(false);
                        //标签id是否存在
                        DimData dim = dimMapper.detail(strings[8]);
                        if (dim != null && dim.getDimName().equals(strings[9])) { //存在 则更新标签,新增标签项数据
                            dimMapper.update(dimData);
                        } else if (dim != null && !dim.getDimName().equals(strings[9])) { //存在 但标签名不一致
                            dimMapper.update(dimData);
                        } else {  //不存在  则新建标签,新增标签项数据
                            //标签名是否存在
                            String dimName = dimMapper.findDimName(strings[9]);
                            if (dimName == null || "".equals(dimName)) {
                                dimMapper.add(dimData);
                            }
                        }
                    }
                } else {
                    throw new DimException(ExceptionCodes.EXPORT_70001);
                }
            }
        } catch (DimException e) {
            return new DimRep(e.getCode());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new DimRep(BaseCode.SUCCESS);
    }



    //设置标签目录
    private void setCatalog(DimData dimData, String[] strings) {
        //根据名称查询目录是否存在
        String catalogId = "";
        Map map = new HashMap();
        map.put("name", strings[4]);
        map.put("level", 1);
        catalogId = catalogMapper.findCatalogByName(map);
        //一级目录存在
        if (catalogId != null && !"".equals(catalogId)) {
            //设置目录id为一级目录
            dimData.setCatalogId(catalogId);
            map.put("name", strings[5]);
            map.put("level", 2);
            map.put("parentId", catalogId);
            catalogId = catalogMapper.findCatalogByName(map);
            //二级目录存在
            if (catalogId != null && !"".equals(catalogId)) {
                dimData.setCatalogId(catalogId);
                map.put("name", strings[6]);
                map.put("level", 3);
                map.put("parentId", catalogId);
                catalogId = catalogMapper.findCatalogByName(map);
                //三级目录存在
                if (catalogId != null && !"".equals(catalogId)) {
                    dimData.setCatalogId(catalogId);
                }
            }
        } else {
            dimData.setCatalogId("000");
        }
    }

    /**
     * 判断一条数据是否符合
     *
     * @param strings
     * @return
     */
    public boolean checkList(String[] strings) {
        List<Integer> indexArr = Arrays.asList(1, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 38, 39);
        for (int i = 0; i < indexArr.size(); i++) {
            Integer index = indexArr.get(i);
            if (strings.length <= index || strings[index] == null || "".equals(strings[index].trim())) {
                log.info("====标签文件空格位置："+index);
                throw new DimException(ExceptionCodes.EXPORT_70001);
            }
        }
        return true;
    }


    @Override
    public DimRep itemUpload(MultipartFile excelItemFile) {
        try {
            //读取Excel文件
            List<String[]> list = POIUtils.readExcel(excelItemFile);
            if (list != null && list.size() > 0) {
                //符合要求的数据
                List<String[]> queryList = new ArrayList<>();
                for (int i = 1; i < list.size(); i++) {
                    if (checkItemList(list.get(i))) {
                        queryList.add(list.get(i));
                    }
                }
                //标签项
                DimItem dimItem = new DimItem();
                //数据处理
                if (queryList != null && queryList.size() > 0) {
                    for (String[] strings : queryList) {
                        log.info("读取的内容："+Arrays.toString(strings));
                        dimItem.setDimId(strings[1]);//标签ID
                        dimItem.setItemNo(strings[3]);//标签值码值
                        dimItem.setItemName(strings[4]);//标签值
                        dimItem.setUpdateDate(DateHelper.currentDateTime());

                        //先判断标签是否存在且指示标签没有标签项
                        DimData dim = dimMapper.detail(strings[1]);
                        if (null == dim){
                            log.info("标签ID:"+strings[1]+"不存在");
                            throw new DimException(ExceptionCodes.EXPORT_70003);
                        }else{
                            if (!"03".equals(dim.getClassify())){
                                //校验标签项是否重复
                                String dimItemId = dimItemMapper.checkDimItem(dimItem);
                                if (StringUtils.isNotEmpty(dimItemId)) {
                                    dimItemMapper.del(dimItemId);
                                }
                                dimItemMapper.add(IdWorker.nextId(), strings[1], strings[3], strings[4], DateHelper.currentDateTime());
                            }
                        }
                    }
                } else {
                    throw new DimException(ExceptionCodes.EXPORT_70002);
                }
            }
        } catch (DimException e) {
            return new DimRep(e.getCode());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new DimRep(BaseCode.SUCCESS);
    }

    /**
     * 判断一条数据是否符合
     *
     * @param strings
     * @return
     */
    public boolean checkItemList(String[] strings) {
        List<Integer> indexArr = Arrays.asList(1, 2, 3, 4);
        for (int i = 0; i < indexArr.size(); i++) {
            Integer index = indexArr.get(i);
            if (strings.length <= index || strings[index] == null || "".equals(strings[index].trim())) {
               log.info("====标签项文件空格位置："+index);
               throw new DimException(ExceptionCodes.EXPORT_70002);
            }
        }
        return true;
    }
}
